package RMI;

import java.net.MalformedURLException;
import java.rmi.AccessException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.Iterator;
import java.util.LinkedHashMap;

public class SurnomServeur extends UnicastRemoteObject implements SurnomInterface {
    
    LinkedHashMap<String, String> infos;

    protected SurnomServeur() throws RemoteException {
        super();
        infos = new LinkedHashMap<String, String>();
        initialize();
    }
    
    private void initialize() {
        this.infos.put("Surnom1", "Nom1");
        this.infos.put("Surnom2", "Nom2");
        this.infos.put("Surnom3", "Nom3");
    }

    @Override
    public String add(String nom, String surnom) throws RemoteException {
        String old = this.infos.put(surnom, nom);
        if(old == null) {
            return "OK";
        } else {
            this.infos.put(surnom, old);
            return "ERROR_02 : le surnom existe déjà.";
        }
    }

    @Override
    public String delete(String surnom) throws RemoteException {
        return "Service non implémenté.";
    }

    @Override
    public String list(String nom) throws RemoteException {
        return "Service non implémenté.";
    }

    @Override
    public String list_all() throws RemoteException {
        StringBuilder s = new StringBuilder();
        Iterator<String> i = this.infos.keySet().iterator();
        String cle = null, associe = null;
        while(i.hasNext()) {
            cle = (String)(i.next());
            associe = this.infos.get(cle);
            s.append("Surnom : " + cle + ", Nom : " + associe +"\n");
        }
        return s.toString();
    }
    
    public static void main(String args[]) {
        System.out.println("Lancement du serveur.");
        // Création du serveur
        SurnomServeur monServeur = null;
        try {
            monServeur = new SurnomServeur();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        
        // Création du stub
        SurnomInterface stub = null;
        try {
            stub = (SurnomInterface) UnicastRemoteObject.exportObject(monServeur, 2345);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        
        Registry r = null;
        try {
            r = LocateRegistry.createRegistry(1099);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        
        try {
            r.rebind("TiensMonMail", (Remote) stub);
        } catch (AccessException e) {
            e.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        
        
        System.out.println("Serveur lancé.");
    }

}
